/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DataTier;

import EntitiesTier.ClContrato;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import Utils.Utilidades;
/**
 *
 * @author Douglas
 */
public class ContratoDAO {
     private Connection conn;
    
    public ContratoDAO() throws Exception{
        
        try{
            this.conn = ConnectionFactory.getConnection();
        }
        catch(Exception e){
            throw e;
        }
    }
    
    public int incluir(ClContrato clContrato) throws Exception{
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs = null;
        if(clContrato == null)
            throw new Exception("O valor passado não pode ser nulo");
        
        try{
            String SQL = "INSERT INTO contrato(CONT_NOME, CONT_DATAASSIN, CONT_DURACAO, CONT_STATUS ," 
                    + "CONT_VALORINI, CONT_VALORFIM, CONT_DATAFINAL, CONT_CODFORN, CONT_SETOR, CONT_TIPODUR) "
                    + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
            conn = this.conn;
            ps = conn.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS);
            ps.setString(1, clContrato.getCONT_NOME());
            ps.setDate(2, Utilidades.SetDataBD(clContrato.getCONT_DATAASSI()));
            ps.setInt(3, clContrato.getCONT_DURACAO());
            ps.setString(4, clContrato.getCONT_STATUS());
            ps.setFloat(5, clContrato.getCONT_VALORINI());
            ps.setFloat(6, clContrato.getCONT_VALORFIM());
            ps.setDate(7, Utilidades.SetDataBD(clContrato.getCONT_DATAFIM()) );
            ps.setInt(8, clContrato.getCONT_CODFOR());
            ps.setString(9, clContrato.getCONT_SET());
            ps.setInt(10, clContrato.getCONT_TIPODUR());
            ps.executeUpdate();
            rs = ps.getGeneratedKeys();
            if(rs.next())
            { 
                clContrato.setCONT_COD(rs.getInt(1));
            }
        }catch(SQLException e){
            throw e;
        }finally{
            ConnectionFactory.closeConnection(conn, ps);
            return(clContrato.getCONT_COD());
        }
    }
        
    public void atualizar(ClContrato clContrato) throws Exception
    {
        PreparedStatement ps = null;
        Connection conn = null;

        if(clContrato == null)
            throw new Exception("O valor passado não pode ser nulo");

        try
        {
            String SQL = "UPDATE contrato CONT_COD = ?, CONT_NOME = ?, CONT_DATAASSIN = ?, CONT_DURACAO = ? ,"
                    + " CONT_STATUS = ?, CONT_VALORINI = ?, CONT_VALORFIM = ?, CONT_DATAFINAL = ?, "
                    + " CONT_CODFORN  = ?, CONT_SETOR = ?, CONT_TIPODUR = ? where CONT_COD = ?";
            conn = this.conn;
            ps = conn.prepareStatement(SQL);
            ps.setString(1, clContrato.getCONT_NOME());
            ps.setDate(2, Utilidades.SetDataBD(clContrato.getCONT_DATAASSI()));
            ps.setInt(3, clContrato.getCONT_DURACAO());
            ps.setString(4, clContrato.getCONT_STATUS());
            ps.setFloat(5, clContrato.getCONT_VALORINI());
            ps.setFloat(6, clContrato.getCONT_VALORFIM());
            ps.setDate(7, Utilidades.SetDataBD(clContrato.getCONT_DATAFIM()) );
            ps.setInt(8, clContrato.getCONT_CODFOR());
            ps.setString(9, clContrato.getCONT_SET());
            ps.setInt(10, clContrato.getCONT_TIPODUR());
            ps.setInt(11, clContrato.getCONT_COD());
            ps.executeUpdate();
        }catch(SQLException e){
            throw e;
        }finally{
            ConnectionFactory.closeConnection(conn, ps);
        }
        
    }
    
    public List todos() throws Exception
    {
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs = null;

        try
        {
            conn = this.conn;
            ps = conn.prepareStatement("SELECT * FROM contrato c");
            rs = ps.executeQuery();
            List<ClContrato> lista = new ArrayList<ClContrato>();
            while(rs.next())
            {
                int cont_cod = rs.getInt("CONT_COD");
                String cont_nome = rs.getString("CONT_NOME");
                java.util.Date cont_dataassin = Utilidades.GetDatabd(rs.getDate("CONT_DATAASSIN"));
                int cont_duracao = rs.getInt("CONT_DURACAO");
                String cont_status = rs.getString("CONT_STATUS");
                float cont_valorini = rs.getFloat("CONT_VALORINI");
                float cont_valorfim = rs.getFloat("CONT_VALORFIM");
                java.util.Date cont_datafim = Utilidades.GetDatabd(rs.getDate("CONT_DATAFINAL"));
                int cont_codforn = rs.getInt("CONT_CODFORN");
                String cont_set = rs.getString("CONT_SETOR");
                int cont_tipodur = rs.getInt("CONT_TIPODUR");
                
                ClContrato clContrato = new ClContrato(cont_cod, cont_codforn, cont_nome, cont_dataassin, cont_datafim, 
                        cont_duracao, cont_status, cont_valorini, cont_valorfim, cont_set, cont_tipodur);

                lista.add(clContrato);
            }
            return lista;
        }catch(SQLException e){
            throw e;
        }finally{
            ConnectionFactory.closeConnection(conn, ps, rs);
        }
    }
    
    public ClContrato procurar(int cont_cod) throws Exception
    {
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs = null;

        try
        {
            conn = this.conn;
            ps = conn.prepareStatement("SELECT * FROM contrato WHERE CONT_COD = ?");
            ps.setInt(1, cont_cod);
            rs = ps.executeQuery();
            if(!rs.next())
            {
                throw new Exception("Não foi encontrado nenhum "
                        + "registro com o ID: " + cont_cod);
            }
                String cont_nome = rs.getString("CONT_NOME");
                java.util.Date cont_dataassin = Utilidades.GetDatabd(rs.getDate("CONT_DATAASSIN"));
                int cont_duracao = rs.getInt("CONT_DURACAO");
                String cont_status = rs.getString("CONT_STATUS");
                float cont_valorini = rs.getFloat("CONT_VALORINI");
                float cont_valorfim = rs.getFloat("CONT_VALORFIM");
                java.util.Date cont_datafim = Utilidades.GetDatabd(rs.getDate("CONT_DATAFINAL"));
                int cont_codforn = rs.getInt("CONT_CODFORN");
                String cont_set = rs.getString("CONT_SETOR");
                int cont_tipodur = rs.getInt("CONT_TIPODUR");

            ClContrato clContrato = new ClContrato(cont_cod, cont_codforn, cont_nome, cont_dataassin, cont_datafim, 
                        cont_duracao, cont_status, cont_valorini, cont_valorfim, cont_set, cont_tipodur);

            return clContrato;
        }catch(SQLException e){
            throw e;
        }finally{
            ConnectionFactory.closeConnection(conn, ps, rs);
        }
    }
    
    public ClContrato procurar(String cont_nome) throws Exception
    {
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs = null;

        try
        {
            conn = this.conn;
            ps = conn.prepareStatement("SELECT * FROM contrato WHERE CONT_NOME = ?");
            ps.setString(1, cont_nome);
            rs = ps.executeQuery();
            if(!rs.next())
            {
                throw new Exception("Não foi encontrado nenhum "
                        + "registro com o ID: " + cont_nome);
            }
                int cont_cod = rs.getInt("CONT_COD");
                java.util.Date cont_dataassin = Utilidades.GetDatabd(rs.getDate("CONT_DATAASSIN"));
                int cont_duracao = rs.getInt("CONT_DURACAO");
                String cont_status = rs.getString("CONT_STATUS");
                float cont_valorini = rs.getFloat("CONT_VALORINI");
                float cont_valorfim = rs.getFloat("CONT_VALORFIM");
                java.util.Date cont_datafim = Utilidades.GetDatabd(rs.getDate("CONT_DATAFINAL"));
                int cont_codforn = rs.getInt("CONT_CODFORN");
                String cont_set = rs.getString("CONT_SETOR");
                int cont_tipodur = rs.getInt("CONT_TIPODUR");

            ClContrato clContrato = new ClContrato(cont_cod, cont_codforn, cont_nome, cont_dataassin, cont_datafim, 
                        cont_duracao, cont_status, cont_valorini, cont_valorfim, cont_set, cont_tipodur);

            return clContrato;
        }catch(SQLException e){
            throw e;
        }finally{
            ConnectionFactory.closeConnection(conn, ps, rs);
        }
    }
    
    public void excluir(int cont_cod) throws Exception
    {
        PreparedStatement ps = null;
        Connection conn = null;

        if(cont_cod == 0)
        {
            throw new Exception("O valor passado não pode ser nulo");
        }

        try
        {
            conn = this.conn;
            ps = conn.prepareStatement("DELETE FROM contrato WHERE CONT_COD = ?");
            ps.setInt(1, cont_cod);
            ps.executeUpdate();
        }catch(SQLException e){
            throw e;
        }finally{
            ConnectionFactory.closeConnection(conn, ps);
        }
    }
}
